#include "Common.hpp"

int main()
{
    // 1.获取用于区分共享内存的唯一关键字
    key_t key = ftok(g_path_name, g_proj_id);
    if(key < 0)
    {
        perror("Client# ftok");
        exit(1);
    }
    printf("Client# ftok success!\n");

    // 2.创建共享内存
    // 获取已经存在的共享内存
    int shmid = shmget(key, g_shm_size, 0);
    if(shmid < 0)
    {
        perror("Client# shmget error");
        exit(2);
    }
    printf("Client# shmget success!\n");

    // 3.共享内存与进程地址空间相关联
    char* shmaddr = (char*)shmat(shmid, nullptr, 0);
    if(shmaddr == nullptr)
    {
        perror("Client# shmat error");
        exit(3);
    }
    printf("Client# shmat success!\n");

    // ... 通信逻辑 -- 使用管道为共享内存添加访问控制
    int fd = OpenFIFO(g_fifo_fikename, O_WRONLY);

    int index = 0;
    for(char ch = 'a'; ch <= 'c'; ++ch)
    {
        shmaddr[index++] = ch;
        printf("Send message to server success: > %s\n", shmaddr);
        Wake(fd);
        sleep(3);
    }
    sprintf(shmaddr, "quit");
    Wake(fd);

    CloseFIFO(fd);

    // int index = 0;
    // for(char ch = 'a'; ch <= 'c'; ++ch)
    // {
    //     shmaddr[index++] = ch;
    //     printf("Send message to server success: > %s\n", shmaddr);
    //     sleep(3);
    // }
    // sprintf(shmaddr, "quit");

    // 4.接触共享内存与进程地址空间的绑定
    if(shmdt(shmaddr) < 0)
    {
        perror("Client# shmdt error");
        exit(4);
    }
    printf("Client# shmdt success!\n");

    return 0;
}